#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Key.h"

/*        宏定义区       */
#define Menu_0_Length       4 - 1 
#define Menu_0_1_Length     4 - 1
#define Menu_0_2_Length     3 - 1
#define Menu_0_3_Length     4 - 1
#define Menu_0_4_Length     4 - 1
#define Menu_0_1_1_Length   4 - 1



/*      菜单函数声明      */
uint8_t Menu_0(void);
uint8_t Menu_0_1(void);
uint8_t Menu_0_2(void);
uint8_t Menu_0_3(void);
uint8_t Menu_0_4(void);
uint8_t Menu_0_1_1(void);

/*************************/

// 多级菜单优化 -- 向量表
// 菜单向量表
uint8_t (*Menu_Table[])(void) = 
{
	Menu_0, 
	Menu_0_1, Menu_0_2, Menu_0_3, Menu_0_4,
	Menu_0_1_1
};

uint8_t Menu_Layer_0 = 0;		
uint8_t Menu_Layer_1 = 0;		
uint8_t Menu_Slect = 0;         // 菜单选择参数



// 菜单枚举体
typedef enum 
{
    Menu_0_Slect = 0,
    Menu_0_1_Slect,
    Menu_0_2_Slect,
    Menu_0_3_Slect,
    Menu_0_4_Slect,
    Menu_0_1_1_Slect,
}Menu_Enum;

// 主菜单
// 定义菜单函数 Menu_0，返回类型为 uint8_t
uint8_t Menu_0(void)
{
    // 初始化菜单选择指示器为 0
    Menu_Layer_0 = 0;
    // 清空显示屏
    OLED_Clear();
    // 在显示屏上显示 "Music"、"Relax"、"Heart"、"Setting" 四个选项
    OLED_ShowString(16, 0, "Music", OLED_8X16);
    OLED_ShowString(16, 16, "Relax", OLED_8X16);
    OLED_ShowString(16, 32, "Heart", OLED_8X16);
    OLED_ShowString(16, 48, "Setting", OLED_8X16);
    // 在显示屏上显示箭头 指示当前选择
    OLED_ShowImage(0, 0, 16, 16, Array1);
    // 更新显示屏
    OLED_Update();
    // 进入菜单选择循环
    while (1)
    {
        // 如果按键1按下 （确定键）
        if (Key1_Dowm)
        {
            // 清除按键1按下标志
            Key1_Dowm = 0;
            // 根据当前菜单选择指示器的值计算选择的菜单
            Menu_Slect = Menu_0_1_Slect + Menu_Layer_0;
            // 返回当前菜单选择指示器 （目前没用）
            return Menu_Layer_0;
        }
        // 如果按键2按下 （选择移动键）
        if (Key2_Dowm)
        {
            // 清除按键2按下标志
            Key2_Dowm = 0;
            // 菜单选择指示器加1，如果超过3则回到0
            if (++Menu_Layer_0 > Menu_0_Length)
            {
                Menu_Layer_0 = 0;
            }
            // 移动箭头位置
            OLED_ClearArea(0, 0, 16, 64);
            OLED_ShowImage(0, 16 * Menu_Layer_0, 16, 16, Array1);
            OLED_UpdateArea(0, 0, 16, 64);
        }
    }
}

/*                            一级子菜单                 */
// 子菜单 Music
uint8_t Menu_0_1(void)
{
    // 初始化菜单选择指示器为 0
    uint8_t Menu_Layer_0_1 = 0;
    // 清空显示屏
    OLED_Clear();
    // 在显示屏上显示 "Play Music"、"Stop Music"、"Next Music"、"Back" 四个选项
    OLED_ShowString(16, 0, "Play Music", OLED_8X16);
    OLED_ShowString(16, 16, "Stop Music", OLED_8X16);
    OLED_ShowString(16, 32, "Next Music", OLED_8X16);
    OLED_ShowString(16, 48, "Back", OLED_8X16);
    // 在显示屏上显示箭头 指示当前选择
    OLED_ShowImage(0, 0, 16, 16, Array1);
    // 更新显示屏
    OLED_Update();
    while (1)
    {
        // 如果按键1按下 （确定键）
        if (Key1_Dowm)
        {
            // 清除按键1按下标志
            Key1_Dowm = 0;
            if (Menu_Layer_0_1 == Menu_0_1_Length)
            {
                // 如果选择的是 "Back" 则返回上一级菜单
                Menu_Slect = Menu_0_Slect;
                return Menu_Layer_0_1;
            }
            else if(Menu_Layer_0_1 == 0)
            {
                // 否则计算选择的菜单
                Menu_Slect = Menu_0_1_1_Slect + Menu_Layer_0_1;
                return Menu_Layer_0_1;
            }
        }
        // 如果按键2按下 （选择移动键）
        if (Key2_Dowm)
        {
            Key2_Dowm = 0;
            if (++Menu_Layer_0_1 > Menu_0_1_Length)
            {
                Menu_Layer_0_1 = 0;
            }
            // 箭头移动
            OLED_ClearArea(0, 0, 16, 64);
            OLED_ShowImage(0, 16 * Menu_Layer_0_1, 16, 16, Array1);
            OLED_UpdateArea(0, 0, 16, 64);
        }
    }
}

// 子菜单2 Motor Ctrl
uint8_t Menu_0_2(void)
{
    // 菜单选择指示器
    uint8_t Menu_Layer_0_2 = 0;
    // 清空显示屏
    OLED_Clear();
    // 在显示屏上显示 "Speed", "Direction", "Back" 三个选项
    OLED_ShowString(16, 0, "Speed", OLED_8X16);
    OLED_ShowString(16, 16, "Direction", OLED_8X16);
    OLED_ShowString(16, 32, "Back", OLED_8X16);
    // 在显示屏上显示箭头 指示当前选择
    OLED_ShowImage(0, 0, 16, 16, Array1);
    // 更新显示屏
    OLED_Update();
    while (1)
    {
        // 如果按键1按下 （确定键）
        if (Key1_Dowm)
        {
            // 清除按键1按下标志
            Key1_Dowm = 0;
            // 如果选择的是 "Back" 则返回上一级菜单
            if (Menu_Layer_0_2 == Menu_0_2_Length)
            {
                Menu_Slect = Menu_0_Slect;
                return Menu_Layer_0_2;
            }
        }
        // 如果按键2按下 （选择移动键）
        if (Key2_Dowm)
        {
            // 清除按键2按下标志
            Key2_Dowm = 0;
            // 菜单选择指示器加1，如果超过2则回到0
            if (++Menu_Layer_0_2 > Menu_Layer_0_2)
            {
                Menu_Layer_0_2 = 0;
            }
            // 箭头移动
            OLED_ClearArea(0, 0, 16, 64);
            OLED_ShowImage(0, 16 * Menu_Layer_0_2, 16, 16, Array1);
            OLED_UpdateArea(0, 0, 16, 64);
        }
    }
}

// 子菜单3 Heart
uint8_t Menu_0_3(void)
{
    // 菜单选择指示器
    uint8_t Menu_Layer_0_3 = 0;
    // 清空显示屏
    OLED_Clear();
    // 在显示屏上显示 "Heart Rate"、"Blood Pressure"、"Body Temperature"、"Back" 四个选项
    OLED_ShowString(16, 0, "Heart Rate", OLED_8X16);
    OLED_ShowString(16, 16, "Blood Pressure", OLED_8X16);
    OLED_ShowString(16, 32, "Body Temperature", OLED_8X16);
    OLED_ShowString(16, 48, "Back", OLED_8X16);
    // 在显示屏上显示箭头 指示当前选择
    OLED_ShowImage(0, 0, 16, 16, Array1);
    // 更新显示屏
    OLED_Update();
    while (1)
    {
        // 如果按键1按下 （确定键）
        if (Key1_Dowm)
        {
            // 清除按键1按下标志
            Key1_Dowm = 0;
            // 如果选择的是 "Back" 则返回上一级菜单
            if (Menu_Layer_0_3 == Menu_0_3_Length)
            {
                Menu_Slect = Menu_0_Slect;
                return Menu_Layer_0_3;
            }
        }
        // 如果按键2按下 （选择移动键）
        if (Key2_Dowm)
        {
            // 清除按键2按下标志
            Key2_Dowm = 0;
            // 菜单选择指示器加1，如果超过3则回到0
            if (++Menu_Layer_0_3 > Menu_Layer_0_3)
            {
                Menu_Layer_0_3 = 0;
            }
            // 箭头移动
            OLED_ClearArea(0, 0, 16, 64);
            OLED_ShowImage(0, 16 * Menu_Layer_0_3, 16, 16, Array1);
            OLED_UpdateArea(0, 0, 16, 64);
        }
    }
}


// 子菜单4 Setting
uint8_t Menu_0_4(void)
{
    // 菜单选择指示器
    uint8_t Menu_Layer_0_4 = 0;
    // 清空显示屏
    OLED_Clear();
    // 在显示屏上显示 "Brightness"、"Volume"、"Language"、"Back" 四个选项
    OLED_ShowString(16, 0, "Brightness", OLED_8X16);
    OLED_ShowString(16, 16, "Volume", OLED_8X16);
    OLED_ShowString(16, 32, "Language", OLED_8X16);
    OLED_ShowString(16, 48, "Back", OLED_8X16);
    // 在显示屏上显示箭头 指示当前选择
    OLED_ShowImage(0, 0, 16, 16, Array1);
    // 更新显示屏
    OLED_Update();
    while (1)
    {
        // 如果按键1按下 （确定键）
        if (Key1_Dowm)
        {
            // 清除按键1按下标志
            Key1_Dowm = 0;
            // 如果选择的是 "Back" 则返回上一级菜单
            if (Menu_Layer_0_4 == Menu_0_4_Length)
            {
                Menu_Slect = Menu_0_Slect;
                return Menu_Layer_0_4;
            }
        }
        // 如果按键2按下 （选择移动键）
        if (Key2_Dowm)
        {
            // 清除按键2按下标志
            Key2_Dowm = 0;
            // 菜单选择指示器加1，如果超过3则回到0
            if (++Menu_Layer_0_4 > Menu_0_4_Length)
            {
                Menu_Layer_0_4 = 0;
            }
            // 箭头移动
            OLED_ClearArea(0, 0, 16, 64);
            OLED_ShowImage(0, 16 * Menu_Layer_0_4, 16, 16, Array1);
            OLED_UpdateArea(0, 0, 16, 64);
        }
    }
}


/*                            二级子菜单                 */ 
// 子菜单 Music-->Play Music
uint8_t Menu_0_1_1(void)
{
    // 菜单选择指示器
    uint8_t Menu_Layer_0_1_1 = 0;
    // 清空显示屏
    OLED_Clear();
    // 在显示屏上显示 "Bass"、"Drum"、"Guitar"、"Back" 四个选项
    OLED_ShowString(16, 0, "sky", OLED_8X16);
    OLED_ShowString(16, 16, "rain", OLED_8X16);
    OLED_ShowString(16, 32, "wind", OLED_8X16);
    OLED_ShowString(16, 48, "back", OLED_8X16);
    // 在显示屏上显示箭头 指示当前选择
    OLED_ShowImage(0, 0, 16, 16, Array1);
    // 更新显示屏
    OLED_Update();
    while (1)
    {
        // 如果按键1按下 （确定键）
        if (Key1_Dowm)
        {
            // 清除按键1按下标志
            Key1_Dowm = 0;
            if (Menu_Layer_0_1_1 == Menu_0_1_1_Length)
            {
                Menu_Slect = Menu_0_1_Slect;
                return Menu_Layer_0_1_1;
            }
        }
        // 如果按键2按下 （选择移动键）
        if (Key2_Dowm)
        {
            // 清除按键2按下标志
            Key2_Dowm = 0;
            // 菜单选择指示器加1，如果超过3则回到0
            if (++Menu_Layer_0_1_1 > Menu_0_1_1_Length)
            {
                Menu_Layer_0_1_1 = 0;
            }
            // 箭头移动
            OLED_ClearArea(0, 0, 16, 64);
            OLED_ShowImage(0, 16 * Menu_Layer_0_1_1, 16, 16, Array1);
            OLED_UpdateArea(0, 0, 16, 64);
        }
    }
}

// 子菜单 Motor Ctrl-->Speed
uint8_t Menu_0_2_Speed(void)
{
    return 0;
}
